package com.csap.framework.oauth2;

import com.csap.framework.redis.RedisUtil;
import com.csap.framework.util.CollectionsUtil;
import com.csap.framework.util.ObjectUtil;

import java.util.List;
import java.util.Objects;
import java.util.function.Supplier;

/**
 * 用户信息存储服务
 *
 * @Author ycf
 * @Date 2021/8/24 6:30 下午
 * @Version 1.0
 */
public interface UserInfoStoreService {
    String PERMISSIONS = "permissions";
    String USER_PERMISSIONS = "userPermissions";
    String USER_ATTRIBUTE = "user-attribute";
    String ROLE = "role";
    String USERINFO = "userinfo";

    /**
     * 是否刷新 token
     *
     * @return 是否刷新成功
     */
    default Boolean flushUserTime() {
        return Boolean.TRUE;
    }

    /**
     * 获取redis操作类
     *
     * @return redis操作类
     */
    RedisUtil getRedisUtil();

    /**
     * 获取store信息
     *
     * @param key      存储的键
     * @param item     map 键
     * @param supplier 数据函数
     * @param time     过期时间
     * @param <T>      源泛型
     * @return 用户信息
     */
    default <T> T getStore(String key, String item, Supplier<T> supplier, Long time) {
        T t;
        if (ObjectUtil.isNotEmpty(t = (T) getRedisUtil().hget(key, item))) {
            if (flushUserTime()) {
                getRedisUtil().expire(key, time);
            }
            return t;
        }
        t = supplier.get();
        if (ObjectUtil.isNotEmpty(t)) {
            getRedisUtil().hset(key, item, t, time);
        }
        return t;
    }

    /**
     * 删除缓存
     *
     * @param key  redis 键
     * @param item map 键
     */
    default void removeStore(String key, String item) {
        getRedisUtil().hdel(key, item);
    }
}
